package com.xxxtea.config.converter;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.xxxtea.common.BaseEnum;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;

/**
 * Jackson-枚举类反序列化器
 * 
 * 用于将JSON中的整型值反序列化为BaseEnum类型的枚举对象。
 * 支持Spring Boot全局自动注册，适用于所有BaseEnum子类。
 * 
 * @author badman
 * @since 1.0.0
 */
@JsonComponent
public class BaseEnumDeserializer<E extends Enum<?>> extends JsonDeserializer<BaseEnum<E>> {
	/**
	 * 反序列化方法，将JSON整型值转为BaseEnum对象
	 * 
	 * @param jsonParser JSON解析器
	 * @param context 反序列化上下文
	 * @return 枚举对象
	 * @throws IOException IO异常
	 */
	@Override
	public BaseEnum<E> deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
		// 获取当前字段名
		String currentName = jsonParser.currentName();
		// 获取当前对象
		Object currentValue = jsonParser.getCurrentValue();
		// 获取字段类型
		Class<?> clazz = BeanUtils.findPropertyType(currentName, currentValue.getClass());
		// 读取JSON节点
		JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
		// 获取整型值
		int value = jsonNode.asInt();
		// 根据值获取对应的枚举对象
		return BaseEnum.valueOf(clazz, value);
	}
}